package com.it.you.service.pay;

import com.it.you.common.enums.PayCodeEnum;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * PayService2类实现了ApplicationListener接口，这样在onApplicationEvent方法中，就可以拿到ApplicationContext的实例。
 * 我们再获取打了PayCode注解的类，放到一个map中，map中的key就是PayCode注解中定义的value，跟code参数一致，value是支付类的实例。
 * 这种方式的code可以没有业务含义，可以是纯数字，只有不重复就行。
 */
@Service
public class PayService2 implements ApplicationListener<ContextRefreshedEvent> {

    private static Map<String, IPay> payMap = null;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        ApplicationContext applicationContext = contextRefreshedEvent.getApplicationContext();
        //map的 key为bean的名称 value为bean的实例对象
        // key:"aliaPay" value:"AliaPay@6107"
        Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(PayCodeEnum.class);

        if (beansWithAnnotation != null) {
            payMap = new HashMap<>();
            beansWithAnnotation.forEach((key, bean) -> {
                //String bizType = bean.getClass().getAnnotation(PayCodeEnum.class).value();
                Class<?> aClass = bean.getClass();
                PayCodeEnum payCodeEnum = aClass.getAnnotation(PayCodeEnum.class);
                String value = payCodeEnum.value();
                String name = payCodeEnum.name();
                payMap.put(value, (IPay) bean);
            });
        }
    }

    public String pay(String code) {
        return payMap.get(code).pay();
    }

}
